home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gamers Delight 2
/
Gamers Delight 2.iso
/
Aminet
/
game
/
role
/
Ang261Lib.lha
/
src
/
files.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-10-22
|
24KB
|
762 lines
/*
* files.c: misc code to access files used by Moria
*
* Copyright (c) 1989 James E. Wilson, Robert A. Koeneke
*
* This software may be copied and distributed for educational, research, and
* not for profit purposes provided that this copyright and statement are
* included in all such copies.
*/
#include <stdio.h>
#include <errno.h>
#ifndef MSDOS
#include <sys/param.h>
#endif
#include "constant.h"
#include "config.h"
#include "types.h"
#include "externs.h"
#ifdef ibm032
#include <ctype.h>
#endif
#ifdef MSDOS
extern int errno;
#endif
#if defined(GEMDOS) && (__STDC__ == 0)
#include <access.h>
char *strcat();
#endif
#ifdef USG
#ifndef ATARIST_MWC
#include <string.h>
#include <fcntl.h>
#ifdef __MINT__
#include <ctype.h>
#endif
#endif
#else
#include <strings.h>
#ifndef VMS
#include <sys/file.h>
#else
#include <file.h>
#endif
#endif
#ifndef VMS
#if defined(ultrix) || defined(USG)
void exit();
#endif
#endif
/* This is done first in main.c, so I'll rudely drop it into the front
* of files.c... If NEW_FILEPATHS is defined, we'll look for the ANGBAND_PATH
* environment variable, and then look for the files in there. This is
* much nicer than having explicit paths, and should help us make things
* more portable. Now, if only someone would graft on the NetHack display
* code...
*
* This is rather inelegant code; no checks are made for malloc() or
* realloc() failures. If you malloc/realloc are broken, you're in
* trouble, and your compiler vendor needs a good swift kick in the
* forehead. [cjh]
*/
#ifdef NEW_FILEPATHS
char *ANGBAND_TST; /* was LIBDIR(test) */
char *ANGBAND_HOU; /* was LIBDIR(files/hours) */
char *ANGBAND_MOR; /* was LIBDIR(files/news) */
char *ANGBAND_TOP; /* was LIBDIR(files/newscores) */
char *ANGBAND_BONES; /* was LIBDIR(bones) */
char *ANGBAND_HELP; /* was LIBDIR(files/roglcmds.hlp) */
char *ANGBAND_ORIG_HELP; /* was LIBDIR(files/origcmds.hlp) */
char *ANGBAND_WIZ_HELP; /* was LIBDIR(files/rwizcmds.hlp) */
char *ANGBAND_OWIZ_HELP; /* was LIBDIR(files/owizcmds.hlp) */
char *ANGBAND_WELCOME; /* was LIBDIR(files/welcome.hlp) */
char *ANGBAND_LOG; /* was LIBDIR(files/ANGBAND.log) */
char *ANGBAND_VER; /* was LIBDIR(files/version.hlp) */
char *ANGBAND_LOAD; /* was LIBDIR(files/loadcheck) */
char *ANGBAND_WIZ; /* was LIBDIR(files/wizards) */
char *ANGBAND_SAV; /* was LIBDIR(save) */
void get_file_paths()
{
#ifndef MAXPATHLEN
#define BOZO_MAXPATHLEN
#define MAXPATHLEN 512
#endif
char *angband_path;
/* Find the path to our files... if the ANGBAND_PATH environment var
* isn't set, use DEFAULT_PATH to look for the files. If your system
* can't do environment variables, you'll have to kludge this. [cjh]
*/
angband_path = getenv( "ANGBAND_PATH" );
if (angband_path == NULL) {
#if 0 /* I don't think this is appropriate, particularly since this may
* well be set by a system-wide games administrator. -CWS */
fprintf(stderr, "Warning: ANGBAND_PATH not set!\n" );
fprintf(stderr, "Warning: Using %s for ANGBAND_PATH.\n", DEFAULT_PATH );
#endif
angband_path = (char *)malloc( strlen( DEFAULT_PATH ) + 1 );
strcpy( angband_path, DEFAULT_PATH );
}
ANGBAND_TST = (char *)malloc( MAXPATHLEN );
strcpy( ANGBAND_TST, angband_path );
strcat( ANGBAND_TST, PATH_SEP );
strcat( ANGBAND_TST, "test" );
ANGBAND_TST = (char *)realloc( ANGBAND_TST, strlen( ANGBAND_TST ) + 1 );
ANGBAND_HOU = (char *)malloc( MAXPATHLEN );
strcpy( ANGBAND_HOU, angband_path );
strcat( ANGBAND_HOU, PATH_SEP );
strcat( ANGBAND_HOU, "files" );
strcat( ANGBAND_HOU, PATH_SEP );
strcat( ANGBAND_HOU, "hours" );
ANGBAND_HOU = (char *)realloc( ANGBAND_HOU, strlen( ANGBAND_HOU ) + 1 );
ANGBAND_MOR = (char *)malloc( MAXPATHLEN );
strcpy( ANGBAND_MOR, angband_path );
strcat( ANGBAND_MOR, PATH_SEP );
strcat( ANGBAND_MOR, "files" );
strcat( ANGBAND_MOR, PATH_SEP );
strcat( ANGBAND_MOR, "news" );
ANGBAND_MOR = (char *)realloc( ANGBAND_MOR, strlen( ANGBAND_MOR ) + 1 );
ANGBAND_TOP = (char *)malloc( MAXPATHLEN );
strcpy( ANGBAND_TOP, angband_path );
strcat( ANGBAND_TOP, PATH_SEP );
strcat( ANGBAND_TOP, "files" );
strcat( ANGBAND_TOP, PATH_SEP );
strcat( ANGBAND_TOP, "newscores" );
ANGBAND_TOP = (char *)realloc( ANGBAND_TOP, strlen( ANGBAND_TOP ) + 1 );
ANGBAND_BONES = (char *)malloc( MAXPATHLEN );
strcpy( ANGBAND_BONES, angband_path );
strcat( ANGBAND_BONES, PATH_SEP );
strcat( ANGBAND_BONES, "bones" );
ANGBAND_BONES = (char *)realloc( ANGBAND_BONES, strlen( ANGBAND_BONES ) + 1 );
ANGBAND_HELP = (char *)malloc( MAXPATHLEN );
strcpy( ANGBAND_HELP, angband_path );
strcat( ANGBAND_HELP, PATH_SEP );
strcat( ANGBAND_HELP, "files" );
strcat( ANGBAND_HELP, PATH_SEP );
strcat( ANGBAND_HELP, "roglcmds.hlp" );
ANGBAND_HELP = (char *)realloc( ANGBAND_HELP, strlen( ANGBAND_HELP ) + 1 );
ANGBAND_ORIG_HELP = (char *)malloc( MAXPATHLEN );
strcpy( ANGBAND_ORIG_HELP, angband_path );
strcat( ANGBAND_ORIG_HELP, PATH_SEP );
strcat( ANGBAND_ORIG_HELP, "files" );
strcat( ANGBAND_ORIG_HELP, PATH_SEP );
strcat( ANGBAND_ORIG_HELP, "origcmds.hlp" );
ANGBAND_ORIG_HELP = (char *)realloc(ANGBAND_ORIG_HELP,
strlen( ANGBAND_ORIG_HELP ) + 1 );
ANGBAND_WIZ_HELP = (char *)malloc( MAXPATHLEN );
strcpy( ANGBAND_WIZ_HELP, angband_path );
strcat( ANGBAND_WIZ_HELP, PATH_SEP );
strcat( ANGBAND_WIZ_HELP, "files" );
strcat( ANGBAND_WIZ_HELP, PATH_SEP );
strcat( ANGBAND_WIZ_HELP, "rwizcmds.hlp" );
ANGBAND_WIZ_HELP = (char *)realloc(ANGBAND_WIZ_HELP,
strlen( ANGBAND_WIZ_HELP ) + 1 );
ANGBAND_OWIZ_HELP = (char *)malloc( MAXPATHLEN );
strcpy( ANGBAND_OWIZ_HELP, angband_path );
strcat( ANGBAND_OWIZ_HELP, PATH_SEP );
strcat( ANGBAND_OWIZ_HELP, "files" );
strcat( ANGBAND_OWIZ_HELP, PATH_SEP );
strcat( ANGBAND_OWIZ_HELP, "owizcmds.hlp" );
ANGBAND_OWIZ_HELP = (char *)realloc(ANGBAND_OWIZ_HELP,
strlen( ANGBAND_OWIZ_HELP ) + 1 );
ANGBAND_WELCOME = (char *)malloc( MAXPATHLEN );
strcpy( ANGBAND_WELCOME, angband_path );
strcat( ANGBAND_WELCOME, PATH_SEP );
strcat( ANGBAND_WELCOME, "files" );
strcat( ANGBAND_WELCOME, PATH_SEP );
strcat( ANGBAND_WELCOME, "welcome.hlp" );
ANGBAND_WELCOME = (char *)realloc( ANGBAND_WELCOME, strlen( ANGBAND_WELCOME ) + 1 );
ANGBAND_LOG = (char *)malloc( MAXPATHLEN );
strcpy( ANGBAND_LOG, angband_path );
strcat( ANGBAND_LOG, PATH_SEP );
strcat( ANGBAND_LOG, "files" );
strcat( ANGBAND_LOG, PATH_SEP );
strcat( ANGBAND_LOG, "ANGBAND.log" );
ANGBAND_LOG = (char *)realloc( ANGBAND_LOG, strlen( ANGBAND_LOG ) + 1 );
ANGBAND_VER = (char *)malloc( MAXPATHLEN );
strcpy( ANGBAND_VER, angband_path );
strcat( ANGBAND_VER, PATH_SEP );
strcat( ANGBAND_VER, "files" );
strcat( ANGBAND_VER, PATH_SEP );
strcat( ANGBAND_VER, "version.hlp" );
ANGBAND_VER = (char *)realloc( ANGBAND_VER, strlen( ANGBAND_VER ) + 1 );
ANGBAND_LOAD = (char *)malloc( MAXPATHLEN );
strcpy( ANGBAND_LOAD, angband_path );
strcat( ANGBAND_LOAD, PATH_SEP );
strcat( ANGBAND_LOAD, "files" );
strcat( ANGBAND_LOAD, PATH_SEP );
strcat( ANGBAND_LOAD, "loadcheck" );
ANGBAND_LOAD = (char *)realloc( ANGBAND_LOAD, strlen( ANGBAND_LOAD ) + 1 );
ANGBAND_WIZ = (char *)malloc( MAXPATHLEN );
strcpy( ANGBAND_WIZ, angband_path );
strcat( ANGBAND_WIZ, PATH_SEP );
strcat( ANGBAND_WIZ, "files" );
strcat( ANGBAND_WIZ, PATH_SEP );
strcat( ANGBAND_WIZ, "wizards" );
ANGBAND_WIZ = (char *)realloc( ANGBAND_WIZ, strlen( ANGBAND_WIZ ) + 1 );
ANGBAND_SAV = (char *)malloc( MAXPATHLEN );
strcpy( ANGBAND_SAV, angband_path );
strcat( ANGBAND_SAV, PATH_SEP );
strcat( ANGBAND_SAV, "save" );
ANGBAND_SAV = (char *)realloc( ANGBAND_SAV, strlen( ANGBAND_SAV ) + 1 );
return;
}
#ifdef BOZO_MAXPATHLEN
#undef BOZO_MAXPATHLEN
#undef MAXPATHLEN
#endif /* BOZO_MAXPATHLEN */
#endif /* NEW_FILEPATHS */
/* Not touched for Mac port */
/*
* init_scorefile Open the score file while we still have the setuid
* privileges. Later when the score is being written out, you must be sure
* to flock the file so we don't have multiple people trying to write to it
* at the same time. Craig Norborg (doc) Mon Aug 10 16:41:59
* EST 1987
*/
void
init_scorefile()
{
#ifdef SET_UID
if (1 > (highscore_fd = my_topen(ANGBAND_TOP, O_RDWR | O_CREAT, 0644)))
#else
if (1 > (highscore_fd = my_topen(ANGBAND_TOP, O_RDWR | O_CREAT, 0666)))
#endif
{
(void)fprintf(stderr, "Can't open score file \"%s\"\n", ANGBAND_TOP);
exit(1);
}
}
/* Attempt to open the intro file -RAK- */
/* This routine also checks the hours file vs. what time it is -Doc */
void
read_times()
{
register int i;
vtype in_line;
FILE *file1;
#ifdef CHECKHOURS
/* Attempt to read hours.dat. If it does not exist, */
/* inform the user so he can tell the wizard about it */
if ((file1 = my_tfopen(ANGBAND_HOU, "r")) != NULL) {
while (fgets(in_line, 80, file1) != NULL)
if (strlen(in_line) > 3) {
if (!strncmp(in_line, "SUN:", 4))
(void)strcpy(days[0], in_line);
else if (!strncmp(in_line, "MON:", 4))
(void)strcpy(days[1], in_line);
else if (!strncmp(in_line, "TUE:", 4))
(void)strcpy(days[2], in_line);
else if (!strncmp(in_line, "WED:", 4))
(void)strcpy(days[3], in_line);
else if (!strncmp(in_line, "THU:", 4))
(void)strcpy(days[4], in_line);
else if (!strncmp(in_line, "FRI:", 4))
(void)strcpy(days[5], in_line);
else if (!strncmp(in_line, "SAT:", 4))
(void)strcpy(days[6], in_line);
}
(void)fclose(file1);
} else {
restore_term();
(void)fprintf(stderr, "There is no hours file \"%s\".\nPlease inform the wizard, %s, so he can correct this!\n", ANGBAND_HOU, WIZARD);
exit(1);
}
/* Check the hours, if closed then exit. */
if (!check_time()) {
if ((file1 = my_tfopen(ANGBAND_HOU, "r")) != NULL) {
clear_screen();
for (i = 0; fgets(in_line, 80, file1) != NULL; i++)
put_buffer(in_line, i, 0);
(void)fclose(file1);
pause_line(23);
}
exit_game();
}
#endif /* CHECK_HOURS */
/* Print the introduction message, news, etc. */
if ((file1 = my_tfopen(ANGBAND_MOR, "r")) != NULL) {
clear_screen();
for (i = 0; fgets(in_line, 80, file1) != NULL; i++)
put_buffer(in_line, i, 0);
pause_line(23);
(void)fclose(file1);
}
}
/*
* File perusal. -CJS- primitive, but portable
*/
void
helpfile(filename)
const char *filename;
{
bigvtype tmp_str;
FILE *file;
char input;
int i;
file = my_tfopen(filename, "r");
if (file == NULL) {
(void)sprintf(tmp_str, "Can not find help file \"%s\".\n", filename);
prt(tmp_str, 0, 0);
return;
}
save_screen();
while (!feof(file)) {
clear_screen();
for (i = 0; i < 23; i++)
if (fgets(tmp_str, BIGVTYPESIZ - 1, file) != NULL)
put_buffer(tmp_str, i, 0);
prt("[Press any key to continue.]", 23, 23);
input = inkey();
if (input == ESCAPE)
break;
}
(void)fclose(file);
restore_screen();
}
/* Prints a list of random objects to a file. Note that -RAK- */
/* the objects produced is a sampling of objects which */
/* be expected to appear on that level. */
void
print_objects()
{
register int i;
int nobj, j, level;
vtype filename1;
bigvtype tmp_str;
register FILE *file1;
register inven_type *i_ptr;
prt("Produce objects on what level?: ", 0, 0);
level = 0;
if (!get_string(tmp_str, 0, 32, 10))
return;
level = atoi(tmp_str);
prt("Produce how many objects?: ", 0, 0);
nobj = 0;
if (!get_string(tmp_str, 0, 27, 10))
return;
nobj = atoi(tmp_str);
if ((nobj > 0) && (level > -1) && (level < 1201)) {
if (nobj > 10000)
nobj = 10000;
prt("File name: ", 0, 0);
if (get_string(filename1, 0, 11, 64)) {
if (strlen(filename1) == 0)
return;
if ((file1 = my_tfopen(filename1, "w")) != NULL) {
(void)sprintf(tmp_str, "%d", nobj);
prt(strcat(tmp_str, " random objects being produced..."), 0, 0);
put_qio();
(void)fprintf(file1, "*** Random Object Sampling:\n");
(void)fprintf(file1, "*** %d objects\n", nobj);
(void)fprintf(file1, "*** For Level %d\n", level);
(void)fprintf(file1, "\n");
(void)fprintf(file1, "\n");
j = popt();
for (i = 0; i < nobj; i++) {
if (randint(MAX_DUNGEON_OBJ) == 1) {
int tmp;
again:
tmp = randint(MAX_OBJECTS - (SPECIAL_OBJ - 1)) +
(SPECIAL_OBJ - 1) - 1;
switch (tmp) {
case (SPECIAL_OBJ - 1):
if (object_list[tmp].level <= level)
msg_print("*Remove Curse*");
break;
case (SPECIAL_OBJ):
if (object_list[tmp].level <= level)
msg_print("[Resistance of Scarabtarices]");
break;
case (SPECIAL_OBJ + 1):
if (object_list[tmp].level <= level)
msg_print("[Mordenkainen's Escapes]");
break;
case (SPECIAL_OBJ + 2):
if (object_list[tmp].level <= level)
msg_print("[Kelek's Grimoire of Power]");
break;
case (SPECIAL_OBJ + 3):
if (randint(2) == 1)
goto again;
if (object_list[tmp].level <= level)
msg_print("[Tenser's Transformations]");
break;
case (SPECIAL_OBJ + 4):
if (randint(2) == 1)
goto again;
if (object_list[tmp].level <= level)
msg_print("[Raal's Tome of Destruction]");
break;
case (SPECIAL_OBJ + 5):
if (object_list[tmp].level <= level)
msg_print("[Ethereal Openings]");
break;
case (SPECIAL_OBJ + 6):
if (object_list[tmp].level <= level)
msg_print("[Godly Insights]");
break;
case (SPECIAL_OBJ + 7):
if (object_list[tmp].level <= level)
msg_print("[Purifications and Healing]");
break;
case (SPECIAL_OBJ + 8):
if (object_list[tmp].level <= level)
msg_print("[Wrath of God]");
break;
case (SPECIAL_OBJ + 9):
if (randint(2) > 1)
goto again;
if (object_list[tmp].level <= level)
msg_print("[Holy Infusions]");
break; /* End of Books */
case (SPECIAL_OBJ + 10): /* Narya */
if (randint(4) > 1)
goto again;
if (NARYA)
goto again;
if (object_list[tmp].level <= level)
msg_print("Narya");
NARYA = TRUE;
break;
case (SPECIAL_OBJ + 11): /* Nenya */
if (randint(5) > 1)
goto again;
if (NENYA)
goto again;
if (object_list[tmp].level <= level)
msg_print("Nenya");
NENYA = TRUE;
break;
case (SPECIAL_OBJ + 12): /* Vilya */
if (randint(6) > 1)
goto again;
if (VILYA)
goto again;
if (object_list[tmp].level <= level)
msg_print("Vilya");
VILYA = TRUE;
break;
case (SPECIAL_OBJ + 13): /* The Ring of Power */
if (randint(10) > 1)
goto again;
if (POWER)
goto again;
if (object_list[tmp].level <= level)
msg_print("Power (The One Ring)");
POWER = TRUE;
break;
case (SPECIAL_OBJ + 14): /* Dragon Scale mails */
case (SPECIAL_OBJ + 15):
case (SPECIAL_OBJ + 16):
case (SPECIAL_OBJ + 17):
case (SPECIAL_OBJ + 18):
case (SPECIAL_OBJ + 19):
case (SPECIAL_OBJ + 20):
if (randint(2) > 1)
goto again;
if (object_list[tmp].level <= level)
msg_print("Dragon Scale Mail");
break;
case (SPECIAL_OBJ + 23): /* Multi-Hued Dragon
* Scale Mail */
if (randint(3) > 1)
goto again;
if (object_list[tmp].level <= level)
msg_print("Multi-Hued Dragon Scale Mail");
break;
}
if (object_list[tmp].level > level)
continue;
invcopy(&t_list[j], tmp);
if (object_list[t_list[j].index].tval == TV_HARD_ARMOR)
t_list[j].toac += 10 + randint(10);
i_ptr = &t_list[j];
store_bought(i_ptr);
objdes(tmp_str, i_ptr, TRUE);
} else {
invcopy(&t_list[j],
sorted_objects[get_obj_num(level, FALSE)]);
magic_treasure(j, level, 0, FALSE);
i_ptr = &t_list[j];
store_bought(i_ptr);
if (i_ptr->flags & TR_CURSED)
add_inscribe(i_ptr, ID_DAMD);
objdes(tmp_str, i_ptr, TRUE);
}
(void)fprintf(file1, "%d %s.\n", i_ptr->level, tmp_str);
}
pusht((int16) j);
(void)fclose(file1);
prt("Completed.", 0, 0);
} else
prt("File could not be opened.", 0, 0);
}
} else
prt("Parameters no good.", 0, 0);
}
/* Print the character to a file or device -RAK- */
int
file_character(filename1)
char *filename1;
{
register int i;
int j, xbth, xbthb, xfos, xsrh, xstl, xdis, xsave, xdev;
vtype xinfra;
int fd;
register FILE *file1;
bigvtype prt2;
register struct misc *p_ptr;
register inven_type *i_ptr;
vtype out_val, prt1;
const char *p, *colon, *blank;
fd = my_topen(filename1, O_WRONLY | O_CREAT | O_EXCL, 0644);
if (fd < 0 && errno == EEXIST) {
(void)sprintf(out_val, "Replace existing file %s?", filename1);
if (get_Yn(out_val))
fd = my_topen(filename1, O_WRONLY, 0644);
}
if (fd >= 0) {
/*
* on some non-unix machines, fdopen() is not reliable, hence must call
* close() and then fopen()
*/
(void)close(fd);
file1 = my_tfopen(filename1, "w");
} else
file1 = NULL;
if (file1 != NULL) {
prt("Writing character sheet...", 0, 0);
put_qio();
colon = ":";
blank = " ";
(void)fprintf(file1, "%c\n\n", CTRL('L'));
(void)fprintf(file1, " Name%9s %-23s", colon, py.misc.name);
(void)fprintf(file1, "Age%11s %6d ", colon, (int)py.misc.age);
cnv_stat(py.stats.use_stat[A_STR], prt1);
(void)fprintf(file1, " STR : %s\n", prt1);
(void)fprintf(file1, " Race%9s %-23s", colon, race[py.misc.prace].trace);
(void)fprintf(file1, "Height%8s %6d ", colon, (int)py.misc.ht);
cnv_stat(py.stats.use_stat[A_INT], prt1);
(void)fprintf(file1, " INT : %s\n", prt1);
(void)fprintf(file1, " Sex%10s %-23s", colon,
(py.misc.male ? "Male" : "Female"));
(void)fprintf(file1, "Weight%8s %6d ", colon, (int)py.misc.wt);
cnv_stat(py.stats.use_stat[A_WIS], prt1);
(void)fprintf(file1, " WIS : %s\n", prt1);
(void)fprintf(file1, " Class%8s %-23s", colon,
class[py.misc.pclass].title);
(void)fprintf(file1, "Social Class : %6d ", py.misc.sc);
cnv_stat(py.stats.use_stat[A_DEX], prt1);
(void)fprintf(file1, " DEX : %s\n", prt1);
(void)fprintf(file1, " Title%8s %-23s", colon, title_string());
(void)fprintf(file1, "%22s", blank);
cnv_stat(py.stats.use_stat[A_CON], prt1);
(void)fprintf(file1, " CON : %s\n", prt1);
(void)fprintf(file1, "%34s", blank);
(void)fprintf(file1, "%26s", blank);
cnv_stat(py.stats.use_stat[A_CHR], prt1);
(void)fprintf(file1, " CHR : %s\n\n", prt1);
(void)fprintf(file1, " + To Hit : %6d", py.misc.dis_th);
(void)fprintf(file1, "%7sLevel :%9d", blank, (int)py.misc.lev);
(void)fprintf(file1, " Max Hit Points : %6d\n", py.misc.mhp);
(void)fprintf(file1, " + To Damage : %6d", py.misc.dis_td);
(void)fprintf(file1, "%7sExperience :%9ld", blank, (long)py.misc.exp);
(void)fprintf(file1, " Cur Hit Points : %6d\n", py.misc.chp);
(void)fprintf(file1, " + To AC : %6d", py.misc.dis_tac);
(void)fprintf(file1, "%7sMax Exp :%9ld", blank, (long)py.misc.max_exp);
(void)fprintf(file1, " Max Mana%8s %6d\n", colon, py.misc.mana);
(void)fprintf(file1, " Total AC : %6d", py.misc.dis_ac);
if (py.misc.lev >= MAX_PLAYER_LEVEL)
(void)fprintf(file1, "%7sExp to Adv.:%9s", blank, "****");
else
(void)fprintf(file1, "%7sExp to Adv.:%9ld", blank,
(long) (player_exp[py.misc.lev - 1] *
py.misc.expfact / 100));
(void)fprintf(file1, " Cur Mana%8s %6d\n", colon, py.misc.cmana);
(void)fprintf(file1, "%28sGold%8s%9ld\n", blank, colon, (long)py.misc.au);
p_ptr = &py.misc;
xbth = p_ptr->bth + p_ptr->ptohit * BTH_PLUS_ADJ
+ (class_level_adj[p_ptr->pclass][CLA_BTH] * p_ptr->lev);
xbthb = p_ptr->bthb + p_ptr->ptohit * BTH_PLUS_ADJ
+ (class_level_adj[p_ptr->pclass][CLA_BTHB] * p_ptr->lev);
/* this results in a range from 0 to 29 */
xfos = 40 - p_ptr->fos;
if (xfos < 0)
xfos = 0;
xsrh = p_ptr->srh;
/* this results in a range from 0 to 9 */
xstl = p_ptr->stl + 1;
xdis = p_ptr->disarm + 2 * todis_adj() + stat_adj(A_INT)
+ (class_level_adj[p_ptr->pclass][CLA_DISARM] * p_ptr->lev / 3);
xsave = p_ptr->save + stat_adj(A_WIS)
+ (class_level_adj[p_ptr->pclass][CLA_SAVE] * p_ptr->lev / 3);
xdev = p_ptr->save + stat_adj(A_INT)
+ (class_level_adj[p_ptr->pclass][CLA_DEVICE] * p_ptr->lev / 3);
(void)sprintf(xinfra, "%d feet", py.flags.see_infra * 10);
(void)fprintf(file1, "(Miscellaneous Abilities)\n\n");
(void)fprintf(file1, " Fighting : %-10s", likert(xbth, 12));
(void)fprintf(file1, " Stealth : %-10s", likert(xstl, 1));
(void)fprintf(file1, " Perception : %s\n", likert(xfos, 3));
(void)fprintf(file1, " Bows/Throw : %-10s", likert(xbthb, 12));
(void)fprintf(file1, " Disarming : %-10s", likert(xdis, 8));
(void)fprintf(file1, " Searching : %s\n", likert(xsrh, 6));
(void)fprintf(file1, " Saving Throw: %-10s", likert(xsave, 6));
(void)fprintf(file1, " Magic Device: %-10s", likert(xdev, 6));
(void)fprintf(file1, " Infra-Vision: %s\n\n", xinfra);
/* Write out the character's history */
(void)fprintf(file1, "Character Background\n");
for (i = 0; i < 4; i++)
(void)fprintf(file1, " %s\n", py.misc.history[i]);
/* Write out the equipment list. */
j = 0;
(void)fprintf(file1, "\n [Character's Equipment List]\n\n");
if (equip_ctr == 0)
(void)fprintf(file1, " Character has no equipment in use.\n");
else
for (i = INVEN_WIELD; i < INVEN_ARRAY_SIZE; i++) {
i_ptr = &inventory[i];
if (i_ptr->tval != TV_NOTHING) {
switch (i) {
case INVEN_WIELD:
p = "You are wielding";
break;
case INVEN_HEAD:
p = "Worn on head";
break;
case INVEN_NECK:
p = "Worn around neck";
break;
case INVEN_BODY:
p = "Worn on body";
break;
case INVEN_ARM:
p = "Worn on shield arm";
break;
case INVEN_HANDS:
p = "Worn on hands";
break;
case INVEN_RIGHT:
p = "Right ring finger";
break;
case INVEN_LEFT:
p = "Left ring finger";
break;
case INVEN_FEET:
p = "Worn on feet";
break;
case INVEN_OUTER:
p = "Worn about body";
break;
case INVEN_LIGHT:
p = "Light source is";
break;
case INVEN_AUX:
p = "Secondary weapon";
break;
default:
p = "*Unknown value*";
break;
}
objdes(prt2, &inventory[i], TRUE);
(void)fprintf(file1, " %c) %-19s: %s\n", j + 'a', p, prt2);
j++;
}
}
/* Write out the character's inventory. */
(void)fprintf(file1, "%c\n\n", CTRL('L'));
(void)fprintf(file1, " [General Inventory List]\n\n");
if (inven_ctr == 0)
(void)fprintf(file1, " Character has no objects in inventory.\n");
else {
for (i = 0; i < inven_ctr; i++) {
objdes(prt2, &inventory[i], TRUE);
(void)fprintf(file1, "%c) %s\n", i + 'a', prt2);
}
}
(void)fprintf(file1, "%c", CTRL('L'));
fprintf(file1, " [%s%s Home Inventory]\n\n", py.misc.name,
(toupper(py.misc.name[strlen(py.misc.name)-1]) == 'S' ? "'" : "'s"));
if (store[MAX_STORES-1].store_ctr == 0)
(void) fprintf(file1, " Character has no objects at home.\n");
else {
for (i = 0; i < store[MAX_STORES-1].store_ctr; i++) {
if (i==12) fprintf(file1, "\n");
objdes(prt2, &store[MAX_STORES-1].store_inven[i].sitem, TRUE);
(void) fprintf(file1, "%c) %s\n", (i%12)+'a', prt2);
}
}
(void) fprintf(file1, "%c", CTRL('L'));
(void)fclose(file1);
prt("Completed.", 0, 0);
return TRUE;
} else {
if (fd >= 0)
(void)close(fd);
(void)sprintf(out_val, "Can't open file %s:", filename1);
msg_print(out_val);
return FALSE;
}
}